﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp虚方法
{
    class Monster
    {
        public string name;

        public Monster(string name) //构造函数有传参
        {
            this.name = name;
        }

        public  virtual void Attack()  //virtual关键字修饰的方法，叫做虚方法
        {
            Console.WriteLine("{0}攻击了", name);

        }

    }

    class Goblin : Monster
    {
        public  Goblin(string name) : base(name) { }//针对构造函数重载后的写法

        //重写方法并默认调用父类
        public override void Attack()//sealed 在派生类中我们可以通过sealed封闭一个虚方法的重写
        {
            //写自己的
            Console.WriteLine("this is goblin attack");
        }
    }


    class Boss : Monster
    {
        public Boss(string name) : base(name) { }

        public override void Attack()
        {
            Console.WriteLine("this is Boss attack");
        }
    }


    class FireGoblin : Monster 
    {
        public FireGoblin(string name) : base(name) { }

        //public override void Attack() { }

        //public override void Attack()
        //{
        //    base.Attack();
        //}

        //sealed 可以密封一个父类的虚方法的重写，导致新的派生类无法重写
        //密封一个类，让这个类无法被派生
    }

}


